package com.pine.sunshineelder.bed.service.impl;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.github.pagehelper.PageInfo;
import com.pine.sunshineelder.bed.ao.BedAo;
import com.pine.sunshineelder.bed.service.BedService;
import com.pine.sunshineelder.common.StringHelper;
import com.pine.sunshineelder.common.dao.BedDao;
import com.pine.sunshineelder.common.dto.QueryResult;
import com.pine.sunshineelder.common.entity.BedEntity;
import com.pine.sunshineelder.common.exception.ThisSystemException;
import com.pine.sunshineelder.common.validator.ValidateHelper;
/**
 * 
 * @author 卜涛元
 *
 */

@Service
public class BedServiceImpl implements BedService, StringHelper {
	@Autowired
	BedDao bdao;

	@Override
	public BedEntity addBed(BedAo ao) throws Exception {
		// 验证参数
		// 非空
		String state = ValidateHelper.$("状态", ao.getState().toString());
		int state1 = parseInt(state, 1);

		// 执行业务逻辑
		BedEntity u = new BedEntity();

		u.setId(uuid());
		u.setNo(ao.getNo());
		u.setState(state1);
		u.setDescription(ao.getDescription());

		bdao.insert(u);
		// 组装业务结果

		return u;

	}

	@Override
	public BedEntity selectById(String id) throws Exception {
		// 验证参数
		String id1 = ValidateHelper.$("id", id);

		// 执行业务逻辑

		BedEntity u;
		u = bdao.selectById(id1);

		return u;
	}

	@Override
	public List<BedEntity> selectByState(String state) throws Exception {
		// 验证参数
		// 非空
		String state1 = ValidateHelper.$("状态", state);
		int state2 = parseInt(state1, 1);

		// 执行业务逻辑
		// if(state2!=0) {

		// }

		// 组装业务结果
		List<BedEntity> u;

		u = bdao.selectState(state2);

		return u;

	}

	@Override
	public BedEntity modifyBed(String id, Map<String, String> map) throws Exception {
		// 验证参数
		id = ValidateHelper.$("id", id);

		// 执行业务逻辑
		BedEntity bed = bdao.selectById(id);

		if (bed == null) {
			throw new ThisSystemException("id.not-exisits", "非法id");
		}
		Map<String, Object> noUpdateMap = new HashMap<String, Object>();
		Map<String, Object> stateUpdateMap = new HashMap<String, Object>();
		Map<String, Object> desUpdateMap = new HashMap<String, Object>();

		// 2.1 编号
		String newNo = trimAsNull(map.get("no"));
	    System.out.println(newNo);
	    System.out.println("==============================");
		if (newNo != null) {
			if (!Objects.equals(bed.getNo(), newNo)) {
				ValidateHelper.assertLength("编号", newNo, 8, 9);
				ValidateHelper.assertMatch("编号只能是字母和数字组成的6-8位数", newNo, "[0-9a-zA-Z]{8,9}");
				
				// 编号是否存在
				if (bdao.existNo(newNo)) {
					throw new ThisSystemException("no.exists", "此编号已存在");
				}
				// 修改旧对象
				bed.setNo(newNo);
				// 保存要修改的字段
				noUpdateMap.put("no", newNo);
			}
		}

		// 2.2 状态
		System.out.println("-----------");
		Integer newState = parseInt(map.get("state"), 1);
		System.out.println(newState);
		System.out.println("++++++++++");
		if (!Objects.equals(bed.getState(), newState)) {
			// ValidateHelper.assertLength("状态", newState, 1, 2);
			bed.setState(newState);
			stateUpdateMap.put("state", newState);
		}
        //2.3床位描述信息修改
		String newDescription = trimAsNull(map.get("description"));
		if (newDescription != null) {
			if (!Objects.equals(bed.getDescription(), newDescription)) {

				// 修改旧对象
				bed.setNo(newDescription);
				// 保存要修改的字段
				desUpdateMap.put("description", newDescription);
			}
		}
		// 2.3 进行实际的修改
		System.out.println(noUpdateMap);
		System.out.println(stateUpdateMap);
		System.out.println(desUpdateMap);
		if (!noUpdateMap.isEmpty()) {
			bdao.update(id, noUpdateMap);
		}
		if (!stateUpdateMap.isEmpty()) {
			bdao.update(id, stateUpdateMap);
		}
		if (!desUpdateMap.isEmpty()) {
			bdao.update(id, desUpdateMap);
		}
		// 3组装业务结果

		return bed;
	}

	@Override
	public QueryResult queryByKey(String key, Integer pageNo, Integer pageSize) throws Exception {
//		key = trimAsNull(key);
//		if (key != null) {
//			key = "%" + key + "%";
//		}

		if (pageNo == null) {
			pageNo = 1;
		}
		if (pageSize == null) {
			pageSize = 6;
		}
		List<BedEntity> rows = bdao.selectByKey(key, pageNo, pageSize);

		PageInfo pageInfo = new PageInfo(rows);

		int totalRows = (int) pageInfo.getTotal();

		QueryResult result = new QueryResult();
		result.setPageNo(pageNo);
		result.setPageSize(pageSize);
		result.setTotalRows(totalRows);
		result.setRows(rows);
		return result;
	}

}
